package com.yssoft.controller.core;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yssoft.controller.BaseController;
import com.yssoft.entity.core.TCode;
import com.yssoft.entity.core.TProductClassify;
import com.yssoft.entity.core.TProducts;
import com.yssoft.service.core.CodeService;
import com.yssoft.service.core.ProductClassifyService;
import com.yssoft.service.core.ProductsService;
import com.yssoft.utils.UploadFile;

/**
 * @类名称: ProductsController
 * @类描述: 产品控制器
 * @作者: 洪丰
 * @创建时间:2018年4月27日 上午9:51:47
 */
@Controller
@RequestMapping(value = "/products")
public class ProductsController extends BaseController
{
	@Autowired
	private ProductsService productsService;
	@Autowired
	private CodeService codeService;
	@Autowired
	private ProductClassifyService productClassifyService;

	/**
	 * @方法名称: list
	 * @功能描述: 跳转到产品列表页
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午9:53:19
	 * @param model
	 * @return String
	 */
	@RequestMapping(value = "/list")
	public String list(Model model){
		return "core/products/productsList";
	}

	/**
	 * @方法名称: findProductPage
	 * @功能描述: 获取产品数据列表
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午9:55:44
	 * @param page
	 * @param limit
	 * @param productName
	 * @return JSONObject
	 */
	@RequestMapping("/findProductPage")
    @ResponseBody
    public JSONObject findProductPage(@RequestParam(name = "page",defaultValue = "0") int page , @RequestParam(name = "limit",defaultValue = "10") int limit, String productName){
        JSONObject jsonObject = productsService.queryProductPage(page, limit, productName);
        return jsonObject;
    }
	
	/**
	 * @方法名称: create
	 * @功能描述: 跳转到新增产品页面
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午9:57:28
	 * @param model
	 * @return String
	 */
	@RequestMapping(value = "create", method = RequestMethod.GET)
	public String create(Model model) {
		model.addAttribute("action", "saveProducts");
		model.addAttribute("entity", new TProducts());
		Map<String,Object> params = new HashMap<String, Object>();
		params.put("classify", "traceType");
		model.addAttribute("traceabilityCode", codeService.findCodeByParam(params));
		model.addAttribute("proClassifyList", productsService.findPCAndChildrenList());
		return "core/products/productsForm";
	}
	
	/**
	 * @方法名称: saveProducts
	 * @功能描述: 保存产品
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午9:59:02
	 * @param entity
	 * @param redirectAttributes
	 * @return String
	 */
	@RequestMapping(value = "saveProducts", produces = "text/plain;charset=UTF-8")
	@ResponseBody
	public String saveProducts(TProducts entity, String imgId, String tImgId, HttpServletResponse response) {
		System.out.println("=== ProductsController.saveProducts 被调用 ===");
		try {
			// 确保响应头正确设置
			response.setContentType("text/plain;charset=UTF-8");
			response.setStatus(HttpServletResponse.SC_OK);
			
			productsService.addAcc(entity,imgId,tImgId);
			System.out.println("=== 保存成功，返回 success ===");
			return "success";
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("=== 保存失败，返回 error ===");
			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			return "error";
		}
	}
	
	/**
	 * @方法名称: update
	 * @功能描述: 跳转到更新页面
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午10:07:19
	 * @param id
	 * @param model
	 * @return String
	 */
	@RequestMapping(value = "update/{id}", method = RequestMethod.GET)
	public String update(@PathVariable("id") Integer id, Model model) {

		Map<String,Object> params = new HashMap<String, Object>();
		params.put("classify", "traceType");
		TProducts entity = this.productsService.queryProductById(id);
		if(null != entity.gettPId()){
			TProductClassify classifyEntity = this.productClassifyService.queryRoleById(entity.gettPId());
			model.addAttribute("classifyEntity", classifyEntity);
		}
		model.addAttribute("imgList", productsService.findProductImgList(id));
		model.addAttribute("traceabilityCode", codeService.findCodeByParam(params));
		model.addAttribute("action", "update");
		model.addAttribute("entity", entity);
		model.addAttribute("proClassifyList", productsService.findPCAndChildrenList());
		return "core/products/productsForm";
	}
	
	/**
	 * @方法名称: view
	 * @功能描述: 查看产品详细
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午10:08:56
	 * @param id
	 * @param model
	 * @return String
	 */
	@RequestMapping(value = "view/{id}", method = RequestMethod.GET)
	public String view(@PathVariable("id") Integer id, Model model) {
		
		TProducts entity = this.productsService.queryProductById(id);
		if(null != entity.gettPId()){
			TProductClassify classifyEntity = this.productClassifyService.queryRoleById(entity.gettPId());
			model.addAttribute("classifyEntity", classifyEntity);
		}
		if(null != entity.getTraceabilityType()){
			Map<String,Object> params = new HashMap<String, Object>();
			params.put("classify", "traceType");
			List<TCode> codeList = codeService.findCodeByParam(params);
			for(TCode cEnity : codeList){
				if(cEnity.getCode().equals(entity.getTraceabilityType())){
					String traceabilityName = cEnity.getDescribed();
					model.addAttribute("traceabilityName", traceabilityName);
				}
			}
		}
		model.addAttribute("imgList", productsService.findProductImgList(id));
		model.addAttribute("action", "update");
		model.addAttribute("entity", entity);
		
		return "core/products/productsView";
	}
	
	/**
	 * @方法名称: update
	 * @功能描述: 修改产品
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午10:09:41
	 * @param entity
	 * @param response
	 * @return String
	 */
	@RequestMapping(value = "update", produces = "text/plain;charset=UTF-8")
	@ResponseBody
	public String update(TProducts entity, String imgId, String tImgId, HttpServletResponse response) {
		System.out.println("=== ProductsController.update 被调用 ===");
		try {
			// 确保响应头正确设置
			response.setContentType("text/plain;charset=UTF-8");
			response.setStatus(HttpServletResponse.SC_OK);
			
			productsService.editAcc(entity, imgId, tImgId);
			System.out.println("=== 更新成功，返回 success ===");
			return "success";
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("=== 更新失败，返回 error ===");
			response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
			return "error";
		}
	}
	
	/**
	 * @方法名称: delete
	 * @功能描述: 删除产品
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 上午10:10:02
	 * @param roleIds
	 * @return String
	 */
	@RequestMapping(value = "delete", method = RequestMethod.POST)
	@ResponseBody
	public String delete(@RequestParam(value = "productIds") String productIds) {
		String [] productIdArray = productIds.split(",");
		String result = "1";
		for(String id : productIdArray){
			int resultInt = productsService.delAccById(Integer.parseInt(id));
			if(resultInt <= 0){
				result = "0";
			}
		}
        return result;
	}
	
	/**
	 * @方法名称: uploadFile
	 * @功能描述: 上传图片
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 下午4:22:37
	 * @param file
	 * @return Map<String,Object>
	 */
	@ResponseBody
	@RequestMapping(value = "uploadFile", method = RequestMethod.POST)
	public Map<String, Object> uploadFile(MultipartFile file) {
		Map<String, Object> fileNames = UploadFile.compressUploadedFile(file);
		System.out.println("====fileNames==="+fileNames.get("fileName")+"===T==="+fileNames.get("thumbnails"));
		return fileNames;
	}
    
	/**
	 * @方法名称: deleteImg
	 * @功能描述: 删除图片
	 * @作者: 洪丰
	 * @创建时间: 2018年4月27日 下午6:43:12
	 * @param imgId
	 * @return String
	 */
	@RequestMapping(value = "deleteImg", method = RequestMethod.POST)
	@ResponseBody
	public String deleteImg(@RequestParam(value = "imgId") String imgId) {
		String result = "1";
		int resultInt = productsService.delImgById(Integer.parseInt(imgId));
		if(resultInt <= 0){
			result = "0";
		}
        return result;
	}
	
	/**
	 * @方法名称: checkStandardNum
	 * @功能描述: 校验产品标识码
	 * @作者: 洪丰
	 * @创建时间: 2018年4月28日 上午11:33:49
	 * @param standardNum
	 * @return String
	 */
	@RequestMapping(value = "checkStandardNum", method = RequestMethod.POST)
	@ResponseBody
	public String checkStandardNum(@RequestParam(value = "standardNum") String standardNum) {
		String result = "1";
		TProducts product = new TProducts();
		product.setStandardNum(standardNum);
		int resultInt = productsService.queryProductsByRecord(product);
		if(resultInt > 0){
			result = "0";
		}
        return result;
	}
	
	/**
	  * @方法名称: queryProCla
	  * @功能描述: 选择商品类别tree
	  * @作者: 洪丰
	  * @创建时间: 2018年4月28日 下午2:35:52
	  * @param model
	  * @return String
	  */
   @RequestMapping("/queryProCla")
   public String queryProCla(Model model) {
       List<Map<String, Object>> jsonArray = productClassifyService.queryProClaTree();
       model.addAttribute("json", JSONArray.toJSON(jsonArray));
       return "core/products/ProductClassifyTree";
   }
   
   /**
    * @方法名称: toSermigood
    * @功能描述: 获取商品对应半成品
    * @作者: 洪丰
    * @创建时间: 2018年4月28日 下午5:17:14
    * @param id
    * @param model
    * @return String
    */
   @RequestMapping(value = "toSermigood/{id}", method = RequestMethod.GET)
   public String toSermigood(@PathVariable("id") Integer id, Model model) {
	   model.addAttribute("proId", id);
	   model.addAttribute("mySermigoodList", productsService.querySermigoodByProId(id));
	   model.addAttribute("otherSermigoodList", productsService.queryOtherSermigoodByProId(id));
	   return "core/products/productsSermigoodEdit";
	}
   
   /**
    * @方法名称: toMaterial
    * @功能描述: 获取商品对应物料
    * @作者: 洪丰
    * @创建时间: 2018年4月28日 下午5:29:22
    * @param id
    * @param model
    * @return String
    */
   @RequestMapping(value = "toMaterial/{id}", method = RequestMethod.GET)
   public String toMaterial(@PathVariable("id") Integer id, Model model) {
	   model.addAttribute("proId", id);
	   model.addAttribute("myMaterialList", productsService.queryMaterialByProId(id));
	   model.addAttribute("otherMaterialList", productsService.queryOtherMaterialByProId(id));
	   return "core/products/productsMaterialEdit";
	}
   
   /**
    * @方法名称: addProductSermigood
    * @功能描述: 添加产品对应半成品
    * @作者: 洪丰
    * @创建时间: 2018年4月28日 下午8:37:49
    * @param segoodIds
    * @param prodId
    * @return String
    */
   	@RequestMapping(value = "addProductSermigood", method = RequestMethod.POST)
	@ResponseBody
	public String addProductSermigood(String segoodIds,int prodId) {
		String result = "1";
		try {
			productsService.insertProductSermigoodFun(segoodIds,prodId);
		} catch (Exception e) {
			e.printStackTrace();
			result = "0";
		}
       return result;
	}
   	
   	/**
   	 * @方法名称: delProductSermigood
   	 * @功能描述: 删除产品对应半成品
   	 * @作者: 洪丰
   	 * @创建时间: 2018年4月28日 下午8:38:12
   	 * @param segoodIds
   	 * @param prodId
   	 * @return String
   	 */
   	@RequestMapping(value = "delProductSermigood", method = RequestMethod.POST)
	@ResponseBody
	public String delProductSermigood(String segoodIds,int prodId) {
		String result = "1";
		try {
			productsService.deleteProductSermigoodFun(segoodIds,prodId);
		} catch (Exception e) {
			e.printStackTrace();
			result = "0";
		}
       return result;
	}
   	
   	/**
   	 * @方法名称: insertProductMaterialFun
   	 * @功能描述: 增加产品对应物料
   	 * @作者: 洪丰
   	 * @创建时间: 2018年4月28日 下午8:38:31
   	 * @param materialIds
   	 * @param prodId
   	 * @return String
   	 */
	@RequestMapping(value = "addProductMaterial", method = RequestMethod.POST)
	@ResponseBody
	public String insertProductMaterialFun(String materialIds, int prodId, String packageNums) {
		String result = "1";
		try {
			productsService.insertProductMaterialFun(materialIds,prodId,packageNums);
		} catch (Exception e) {
			e.printStackTrace();
			result = "0";
		}
       return result;
	}
	
   	/**
   	 * @方法名称: delProductMaterialFun
   	 * @功能描述: 删除产品对应物料
   	 * @作者: 洪丰
   	 * @创建时间: 2018年4月28日 下午8:38:48
   	 * @param materialIds
   	 * @param prodId
   	 * @return String
   	 */
	@RequestMapping(value = "delProductMaterial", method = RequestMethod.POST)
	@ResponseBody
	public String delProductMaterialFun(String materialIds,int prodId) {
		String result = "1";
		try {
			productsService.deleteProductMaterialFun(materialIds,prodId);
		} catch (Exception e) {
			e.printStackTrace();
			result = "0";
		}
       return result;
	}
}
